<?php
declare (strict_types=1);

namespace app\admin\model\dev;

use app\admin\model\admin\Role;
use app\BaseModel;
use think\db\Query;
use think\Model;

/**
 * @mixin \think\Model
 */
class Api extends BaseModel
{
    // 默认数据库连接
    protected $connection = 'mysql';
    // 主键列
    protected $pk = 'id';
    // 表名称
    protected $name = 'dev_menu';
    // 全局作用域
    protected $globalScope = ['app'];

    // 插入时自动填充
    protected $insert = ['app'];

    // json
    protected $json = ['config'];

    // 设置JSON数据返回数组
    protected $jsonAssoc = true;

    // 设置 app 字段为只读，禁止更新
    protected $readonly = ['app'];

    // 取消驼峰
    protected $convertNameToCamel = false;

    protected function setAppAttr($value, $data)
    {
        return 'api';
    }

    // 全局作用域，过滤 app
    public function scopeApp($query)
    {
        $query->where('app','api');
    }

    /**
     * 每个菜单都属于某个父菜单
     * @return \think\model\relation\BelongsTo
     */
    public function parent(): \think\model\relation\BelongsTo
    {
        return $this->belongsTo(Api::class, 'pid', 'id');
    }

    /**
     *  一个菜单属于多个角色，一个角色拥有多个菜单
     * @return \think\model\relation\BelongsToMany
     */
    public function roles(): \think\model\relation\BelongsToMany
    {
        return $this->belongsToMany(Role::class, 'admin_role_menu', 'role_id', 'menu_id');
    }

    /**
     * 一个菜单具有多个方法
     * @return \think\model\relation\HasMany
     */
    public function actions(): \think\model\relation\HasMany
    {
        return $this->hasMany(Action::class, 'menu_id', 'id');
    }

    /**
     * 一个菜单具有多个字段
     * @return \think\model\relation\HasMany
     */
    public function fields(): \think\model\relation\HasMany
    {
        return $this->hasMany(Field::class, 'menu_id', 'id');
    }

}
